package co.uk.digitalify;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import pojos.Categoria;
import pojos.ListWrapper;
import pojos.Pojo;
import pojos.Producto;
import pojos.Usuario;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import util.Peticion;
import util.PeticionDeserializer;
import util.RespuestaDeserializer;
import util.Servicio;
import util.Query;
import util.Respuesta;
import android.app.Activity;
import android.os.AsyncTask;
import android.support.v4.app.Fragment;
import android.widget.Toast;

public class TareaConexionBD extends AsyncTask<Peticion, Void, Respuesta[]> {

	private String host;
	private int puerto;
	private ReceptorRespuesta recep;
	private String tipoResp;

	public TareaConexionBD(String host, int puerto, ReceptorRespuesta recep,
			String tipoResp) {
		this.host = host;
		this.puerto = puerto;
		this.recep = recep;
		this.tipoResp = tipoResp;
	}

	@Override
	protected Respuesta[] doInBackground(Peticion... peticiones) {
		Gson gs = new GsonBuilder()
				.registerTypeAdapter(Respuesta.class,
						new RespuestaDeserializer())
				.registerTypeAdapter(Peticion.class, new PeticionDeserializer())
				.setDateFormat(Servicio.getSdf().toPattern()).create();		

		PrintWriter pw = null;
		BufferedReader br = null;
		Respuesta[] resps = new Respuesta[peticiones.length];
		Socket sck = null;
		try {
			sck = new Socket(host, puerto);
			sck.setSoTimeout(5000);
			pw = new PrintWriter(new OutputStreamWriter(sck.getOutputStream(), "UTF-8"), true);
			br = new BufferedReader(new InputStreamReader(sck.getInputStream()));

			for (Peticion p : peticiones) {
				String json = gs.toJson(p);
				System.out.println("peticion: " + json);
				pw.println(json);
			}
			pw.println();
			System.out.println("Se envio la peticion");
			String linea = br.readLine();
			System.out.println("Se recibio la respuesta");
			int i = 0;
			while (!linea.isEmpty()) {
				System.out.println("Respuesta: "+linea);
				resps[i] = gs.fromJson(linea, Respuesta.class);
				i++;
				linea = br.readLine();// El servidor enviara una linea vacia
										// despues de la respuesta
			}

		} catch (SocketTimeoutException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			System.out.println("TareaConexionBD: finally");
			try {
				if (pw != null) {
					pw.close();
				}

				if (br != null) {
					br.close();
				}

				if (sck != null) {
					sck.close();
				}

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return resps;
	}

//	private Respuesta obtenerRespuesta(JsonObject jsobj, Gson gs) {
//		JsonArray jsarr = jsobj.get("pojos").getAsJsonArray();
//		int tipo_pojos = jsobj.get("tipo_pojos").getAsInt();
//		Pojo[] pojos = null;
//		switch (tipo_pojos) {
//		case Query.USUARIO_ARRAY:
//			pojos = gs.fromJson(jsarr, Usuario[].class);
//			break;
//		case Query.PRODUCTO_ARRAY:
//			pojos = gs.fromJson(jsarr, Producto[].class);
//			break;
//		case Query.CATEGORIA_ARRAY:
//			pojos = gs.fromJson(jsarr, Categoria[].class);
//			break;
//		case Query.DESCARGA_ARRAY:
//			pojos = gs.fromJson(jsarr, Categoria[].class);
//			break;
//		case Query.PEDIDO_ARRAY:
//			pojos = gs.fromJson(jsarr, Categoria[].class);
//			break;
//		case Query.PRODUCTODETALLE_ARRAY:
//			pojos = gs.fromJson(jsarr, Categoria[].class);
//			break;
//		case Query.TIPOPRODUCTO_ARRAY:
//			pojos = gs.fromJson(jsarr, Categoria[].class);
//			break;
//		case Query.GENERIC_LIST:
//			pojos = gs.fromJson(jsarr, ListWrapper[].class);
//			break;
//
//		}
//		return new Respuesta(jsobj.get("resultado").getAsInt(), tipo_pojos,
//				pojos);
//	}

	@Override
	protected void onPostExecute(Respuesta[] result) {
		recep.recibirRespuesta(result, tipoResp);
	}

}
